AmazonToScrapboxBookmarklet_V2
概要
Amazonの書籍ページ上で実行すると表示されている情報を取得してScrapboxにページを作成します。
あくまで自分用のをついでに公開しているものです。
使い方
1. 下記のコードを適当なテキストエディタにコピペし、冒頭のsettingオブジェクト内のprojectName、format、pageTitleを適宜書き換えてください。
projectNameが空欄の場合は実行時に入力用ダイアログが表示されるのでそこで指定することもできます。
formatはScrapboxにクリップする際にページ本文をどのような形式にするかを指定するものです。
「URL」「書名」「書名補足」「選択範囲」「書影」「著者」及び、Amazonページ内の登録情報欄の各項目のいずれかについて、<書名>のように記述するとそこに情報が入った形で本文が作られます。
pageTitleはページタイトル部分の形式を指定するものです。
書き方はformatと同様です。
pageTitle: '『<書名>』'とすれば『知的生産の技術 (岩波新書)』というような形になります。
この「書名」はポップアップでの確認時に編集できます。
3. 使用しているブラウザのブックマークに登録してお使いください。
※使用時にポップアップがブロックされた場合、使用するにはポップアップのブロックを解除する必要があります。
例
以下の状態でブックマークレットを使用した場合
format欄:format: '[<書影> <URL>]\n<著者>\n<書名補足>\n\n<選択範囲>'
pageTitle欄:pageTitle: '『<書名>』'
選択(反転):
https://gyazo.com/5b3e2de0e29880547e7acdef77c5d590
結果のテキスト(1行目はページタイトル)
code:txt
『知的生産の技術 (岩波新書)』
https://m.media-amazon.com/images/I/61aMKtnQv2L._SY385_.jpg https://www.amazon.co.jp/dp/4004150930
新書 – 1969/7/21
学校では知識は教えるけれど知識の獲得のしかたはあまり教えてくれない。メモのとり方、カードの利用法、原稿の書き方など基本的技術の訓練不足が研究能力の低下をもたらすと考える著者は、長年にわたる模索の体験と共同討論の中から確信をえて、創造的な知的生産を行なうための実践的技術についての提案を試みる。
備考
うまく取得できない場合はご連絡ください。
ブラケティングしない著者情報取得方法も追加するかも
更新履歴
2023/12/16 公開
2023/12/23 17:26 ポップアップの入力欄で書名を書き換えた時に一部反映されていない箇所があったのを修正
2023/12/23 18:52 ページタイトルの書式を記述できるようにした
code:ver2.js
(function () {
// setting内を書き換えてください。
const setting = {
/** Scrapboxのプロジェクト名を記述する */
projectName: '',
/** 本文の書式を記述する(各要素を<>で囲む) */
/** ページタイトルの書式を記述する */
pageTitle: '『<書名>』',
}
// ========================================================
try {
const href = window.location.href;
// Amazonでなければ無効
if (!href.includes('www.amazon.co.jp') || !href.includes('/dp/')) return alert('Amazonの書籍ページではありません。');
// 自分のScrapboxのプロジェクトURLを指定
const PROJECT_NAME = setting.projectName || window.prompt('プロジェクトURL');
if (!PROJECT_NAME) return alert('処理を中断しました。');
// 書名の欄を取得する
const titleElm = document.getElementById('productTitle');
if (!titleElm) throw new Error('タイトルのelement指定が誤っています。');
// 取得した書名をデフォルト値としてページタイトルを決める
const titleContent = titleElm.textContent || '';
const pageTitle = window.prompt('以下を書名として取得します。必要があれば書き換えてください。\nなお選択範囲があれば引用書式でスクラップします。', titleContent.trim());
// タイトルが空欄またはキャンセルを選択の場合は処理を終了
if (!pageTitle) return alert('キャンセルしました。');
// 情報を格納するMapを用意する
const map = new Map();
map.set('URL', href);
map.set('書名', pageTitle);
map.set('書名補足', (() => {
// サブタイトル(書名直後の、バージョンと発売日が書いてある部分)を取得する
const elm = document.getElementById('productSubtitle');
if (!elm) console.error('サブタイトルの要素指定が誤っています。');
return elm ? elm.textContent.trim() : '';
})());
map.set('選択範囲', (() => {
// 選択範囲を取得する
const getSelection = window.getSelection(); // 選択範囲を文字列として取得
if (getSelection && getSelection.toString()) { // 選択範囲があるとき
let text = getSelection.toString();
text = text.replace(/(\W+)( )(\W+)/g, '$1$3'); // 字間に時々紛れている半角スペースを除去
text = text.replace(/(^|\n)/g, '$1> '); // 各行に「> 」を追加
return text;
} else {
return '';
}
})());
map.set('書影', (() => {
// 書影を取得する
const image = document.getElementById('landingImage');
if (!image) console.error('書影の要素指定が誤っています。')
return image ? image.getAttribute('src') : '';
})());
map.set('著者', (() => {
// 著者を取得する
const authors = [];
const elms = document.getElementsByClassName('author');
for (const elm of elms) {
if (!elm.textContent) continue;
const content = elm.textContent.replace(/\r?\n|\t/g, '').replace(/,/,
'');
const category = content.match(/\(.+\)/); // (著)などの部分
const authorName = content.replace(/\(.+\)/, '').replace(/ /g, '');
authors.push({
category, name: [${authorName}]
});
}
return authors.map(obj => obj.category + obj.name).join('/');
})());
// 登録情報を取得する
const container = document.getElementById('detailBullets_feature_div');
if (container) {
const items = container.querySelectorAll('.a-list-item');
items.forEach(item => {
const span = Array.from(item.querySelectorAll('span'));
if (!span.length || span.length > 2) return; // 条件に合わない要素はスキップ
try {
const key = span0.textContent.match(/^^\s*/).toString(); const value = span1.textContent; map.set(key, value);
} catch (e) {
return;
}
})
} else {
console.error('登録情報の指定が誤っています。');
}
console.log(map);
const title = setting.pageTitle.replace(/<(.+?)>/g, (match, target) => map.get(target) || '');
const body = setting.format.replace(/<(.+?)>/g, (match, target) => map.get(target) || '');
// エンコードしてURLをつくる
const url = https://scrapbox.io/${PROJECT_NAME}/${encodeURIComponent(title)}?body=${encodeURIComponent(body)};
// URLを開いてページを作成(または同名のページに追記)
window.open(url);
} catch (err) {
console.error(err);
const p = prompt(
'Amazonの仕様変更によりブックマークレットが無効になっています。\nお手数ですが以下のページで更新をご確認ください。\n「OK」でページを開きます。',
url
);
if (p) window.open(url);
return;
}
})();
(テスト用)
code:bookmarklet.js